using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._CartographyTools._CartographicRefinement
{
    /// <summary>
    /// <para>Generate Hachures For Defined Slopes</para>
    /// <para>Creates multipart lines or polygons representing the slope between the lines representing the upper and lower parts of a slope.</para>
    /// <para>创建多部分线或多边形，表示表示斜坡上部和下部的线之间的坡度。</para>
    /// </summary>    
    [DisplayName("Generate Hachures For Defined Slopes")]
    public class GenerateHachuresForDefinedSlopes : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateHachuresForDefinedSlopes()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_upper_lines">
        /// <para>Upper Line Features</para>
        /// <para>The line features that represent the top of a slope.</para>
        /// <para>表示斜坡顶部的线要素。</para>
        /// </param>
        /// <param name="_lower_lines">
        /// <para>Lower Line Features</para>
        /// <para>The line features that represent the bottom of a slope.</para>
        /// <para>表示斜坡底部的线要素。</para>
        /// </param>
        /// <param name="_output_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing multipart line or polygon hachures representing the slope area.</para>
        /// <para>包含表示坡度区域的多部分线或面影线的输出要素类。</para>
        /// </param>
        public GenerateHachuresForDefinedSlopes(object _upper_lines, object _lower_lines, object _output_feature_class)
        {
            this._upper_lines = _upper_lines;
            this._lower_lines = _lower_lines;
            this._output_feature_class = _output_feature_class;
        }
        public override string ToolboxName => "Cartography Tools";

        public override string ToolName => "Generate Hachures For Defined Slopes";

        public override string CallName => "cartography.GenerateHachuresForDefinedSlopes";

        public override List<string> AcceptEnvironments => ["MDomain", "ZDomain", "extent", "outputCoordinateSystem"];

        public override object[] ParameterInfo => [_upper_lines, _lower_lines, _output_feature_class, _output_type.GetGPValue(), _fully_connected.GetGPValue(), _search_distance, _interval, _minimum_length, _alternate_hachures.GetGPValue(), _perpendicular.GetGPValue(), _polygon_base_width];

        /// <summary>
        /// <para>Upper Line Features</para>
        /// <para>The line features that represent the top of a slope.</para>
        /// <para>表示斜坡顶部的线要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Upper Line Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _upper_lines { get; set; }


        /// <summary>
        /// <para>Lower Line Features</para>
        /// <para>The line features that represent the bottom of a slope.</para>
        /// <para>表示斜坡底部的线要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Lower Line Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _lower_lines { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class containing multipart line or polygon hachures representing the slope area.</para>
        /// <para>包含表示坡度区域的多部分线或面影线的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _output_feature_class { get; set; }


        /// <summary>
        /// <para>Output Feature Type</para>
        /// <para><xdoc>
        ///   <para>Specifies whether polygon triangles or tick lines will be created to represent the slope.</para>
        ///   <bulletList>
        ///     <bullet_item>Polygon triangles—Multipart polygon features will be created in which a triangular polygon is created for each hachure, with the base along the upper line. This is the default.</bullet_item><para/>
        ///     <bullet_item>Line ticks—Multipart line features will be created in which a linear tick is created for each hachure.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否创建多边形三角形或刻度线来表示坡度。</para>
        ///   <bulletList>
        ///     <bullet_item>面三角形—将创建多部分面要素，其中为每个影线创建一个三角形面，底线沿上线。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>线刻度 - 将创建多部分线要素，其中为每个影线创建线性刻度。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _output_type_value _output_type { get; set; } = _output_type_value._POLYGON_TRIANGLES;

        public enum _output_type_value
        {
            /// <summary>
            /// <para>Polygon triangles</para>
            /// <para>Polygon triangles—Multipart polygon features will be created in which a triangular polygon is created for each hachure, with the base along the upper line. This is the default.</para>
            /// <para>面三角形—将创建多部分面要素，其中为每个影线创建一个三角形面，底线沿上线。这是默认设置。</para>
            /// </summary>
            [Description("Polygon triangles")]
            [GPEnumValue("POLYGON_TRIANGLES")]
            _POLYGON_TRIANGLES,

            /// <summary>
            /// <para>Line ticks</para>
            /// <para>Line ticks—Multipart line features will be created in which a linear tick is created for each hachure.</para>
            /// <para>线刻度 - 将创建多部分线要素，其中为每个影线创建线性刻度。</para>
            /// </summary>
            [Description("Line ticks")]
            [GPEnumValue("LINE_TICKS")]
            _LINE_TICKS,

        }

        /// <summary>
        /// <para>Fully connected</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the upper and lower lines in the input data form fully connected areas. If the upper and lower lines are not fully connected, leave this parameter unchecked to create hachures inside areas that are derived by connecting the extremities of the upper and lower features. If the upper and lower lines are fully connected, check this parameter to create hachures inside the fully enclosed areas.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The upper and lower features are not fully connected in the input data. New connections between the upper and lower features will be derived. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The upper and lower features are fully connected in the input data. New connections between features will not be derived.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输入数据中的上行和下行是否构成完全连接的区域。如果上部和下部线未完全连接，则取消选中此参数以在通过连接上部和下部要素的末端而派生的区域内创建影线。如果上下线完全连接，则选中此参数以在全封闭区域内创建影线。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 输入数据中的上部和下部要素未完全连接。将派生上部和下部要素之间的新连接。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 上部和下部要素在输入数据中完全连接。不会派生要素之间的新连接。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Fully connected")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _fully_connected_value _fully_connected { get; set; } = _fully_connected_value._false;

        public enum _fully_connected_value
        {
            /// <summary>
            /// <para>FULLY_CONNECTED</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("FULLY_CONNECTED")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_CONNECTED</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_CONNECTED")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Search Distance</para>
        /// <para>The distance used when deriving connections between the upper and lower features. When the extremities for the upper and lower feature are within this distance, the area between the features is used for creating hachures. The default value is 20 meters. When the Fully connected parameter is checked, this parameter is not available.</para>
        /// <para>派生上部和下部要素之间的连接时使用的距离。当上要素和下要素的末端在此距离内时，要素之间的区域用于创建影线。默认值为 20 米。勾选全连接参数后，该参数不可用。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Search Distance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _search_distance { get; set; } = "20 Meters";


        /// <summary>
        /// <para>Hachure Interval</para>
        /// <para>The distance between the hachure ticks or triangles within the slope area. The default value is 10 meters.</para>
        /// <para>斜坡区域内影线刻度或三角形之间的距离。默认值为 10 米。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Hachure Interval")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _interval { get; set; } = "10 Meters";


        /// <summary>
        /// <para>Minimum Length</para>
        /// <para>The length a hachure tick or triangle must be to be created. Hachures that are shorter than this length will not be created. The default value is 0 meters.</para>
        /// <para>必须创建影线、刻度或三角形的长度。不会创建短于此长度的影线。默认值为 0 米。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum Length")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _minimum_length { get; set; } = "0 Meters";


        /// <summary>
        /// <para>Alternate length of every other hachure</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the length of every other hachure triangle or tick will differ.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—All hachures will be of uniform length, which is the distance between the upper and lower slope lines. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Every other hachure will be one-half the distance between the upper and lower slope lines.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定每隔一个影线三角形或刻度线的长度是否不同。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 所有影线的长度将一致，即上坡度线和下坡度线之间的距离。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 每隔一条影线将是上坡度线和下坡度线之间距离的一半。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Alternate length of every other hachure")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _alternate_hachures_value _alternate_hachures { get; set; } = _alternate_hachures_value._false;

        public enum _alternate_hachures_value
        {
            /// <summary>
            /// <para>ALTERNATE_HACHURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ALTERNATE_HACHURES")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>UNIFORM_HACHURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("UNIFORM_HACHURES")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Perpendicular to upper line</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the hachure ticks or triangles will be perpendicular to the upper slope line.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Hachures will be oriented to obtain even spacing. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Hachures will be oriented perpendicularly to the upper line.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定影线刻度或三角形是垂直于上坡度线。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 影线将定向以获得均匀的间距。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 影线的方向将垂直于上线。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Perpendicular to upper line")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _perpendicular_value _perpendicular { get; set; } = _perpendicular_value._false;

        public enum _perpendicular_value
        {
            /// <summary>
            /// <para>PERPENDICULAR</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("PERPENDICULAR")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_PERPENDICULAR</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_PERPENDICULAR")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Polygon Base Width</para>
        /// <para>The width of the base of triangular polygon hachures. This parameter is active only when the Output Feature Type parameter is set to Polygon triangles. The default value is 5 meters.</para>
        /// <para>三角形多边形影线底部的宽度。仅当输出要素类型参数设置为面三角形时，此参数才处于活动状态。默认值为 5 米。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Polygon Base Width")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _polygon_base_width { get; set; } = "5 Meters";


        public GenerateHachuresForDefinedSlopes SetEnv(object MDomain = null, object ZDomain = null, object extent = null, object outputCoordinateSystem = null)
        {
            base.SetEnv(MDomain: MDomain, ZDomain: ZDomain, extent: extent, outputCoordinateSystem: outputCoordinateSystem);
            return this;
        }

    }

}